%this function subtitute a wrong vector by the median of its neighbors.

%rowWrong and colWrong: matrix coordinates of the grid points that have
%wrong vectors.
%U: matrix to be edited

%created by Ricardo Mejia-Alvarez
%University of Illinois at Urbana-Champaign.
%Urbana, IL. 10/19/2010

function U = substituteMedian(rowWrong , colWrong , U)

SU = size( U );
L = length( rowWrong );
Coord = [rowWrong , colWrong];

for k = 1 : L
    
    if Coord( k , 1 ) > 1 && Coord( k , 1 ) < SU(1) && Coord( k , 2 ) > 1 && Coord( k , 2 ) < SU(2)
        TopRow = U( Coord( k , 1 ) - 1 , Coord( k , 2 ) - 1 : Coord( k , 2 ) + 1 );
        BottomRow = U( Coord( k , 1 ) + 1 , Coord( k , 2 ) - 1 : Coord( k , 2 ) + 1 );
        LeftValue = U( Coord( k , 1 ) , Coord( k , 2 ) - 1 );
        RightValue = U( Coord( k , 1 ) , Coord( k , 2 ) + 1 );
        
        U( Coord( k , 1 ) , Coord( k , 2 ) ) = median( [ TopRow , BottomRow , LeftValue , RightValue ] );
        
    elseif Coord( k , 1 ) == 1 && Coord( k , 2 ) > 1 && Coord( k , 2 ) < SU(2)
        BottomBottomRow = U( Coord( k , 1 ) + 2 , Coord( k , 2 ) );
        BottomRow = U( Coord( k , 1 ) + 1 , Coord( k , 2 ) - 1 : Coord( k , 2 ) + 1 );
        LeftValue = U( Coord( k , 1 ) , Coord( k , 2 ) - 1 );
        RightValue = U( Coord( k , 1 ) , Coord( k , 2 ) + 1 );
        
        U( Coord( k , 1 ) , Coord( k , 2 ) ) = median( [ BottomBottomRow , BottomRow , LeftValue , RightValue ] );
        
    elseif Coord( k , 1 ) == SU(1) && Coord( k , 2 ) > 1 && Coord( k , 2 ) < SU(2)
        TopRow = U( Coord( k , 1 ) - 1 , Coord( k , 2 ) - 1 : Coord( k , 2 ) + 1 );
        TopTopRow = U( Coord( k , 1 ) - 2 , Coord( k , 2 ) );
        LeftValue = U( Coord( k , 1 ) , Coord( k , 2 ) - 1 );
        RightValue = U( Coord( k , 1 ) , Coord( k , 2 ) + 1 );
        
        U( Coord( k , 1 ) , Coord( k , 2 ) ) = median( [ TopRow , TopTopRow , LeftValue , RightValue ] );
        
    elseif Coord( k , 1 ) > 1 && Coord( k , 1 ) < SU(1) && Coord( k , 2 ) == 1
        TopRow = U( Coord( k , 1 ) - 1 , Coord( k , 2 ) : Coord( k , 2 ) + 1 );
        BottomRow = U( Coord( k , 1 ) + 1 , Coord( k , 2 ) : Coord( k , 2 ) + 1 );
        RightValue = U( Coord( k , 1 ) , Coord( k , 2 ) + 1 : Coord( k , 2 ) + 2 );
        
        U( Coord( k , 1 ) , Coord( k , 2 ) ) = median( [ TopRow , BottomRow , RightValue ] );
        
    elseif Coord( k , 1 ) > 1 && Coord( k , 1 ) < SU(1) && Coord( k , 2 ) == SU(2)
        TopRow = U( Coord( k , 1 ) - 1 , Coord( k , 2 ) - 1 : Coord( k , 2 ) );
        BottomRow = U( Coord( k , 1 ) + 1 , Coord( k , 2 ) - 1 : Coord( k , 2 ) );
        LeftValue = U( Coord( k , 1 ) , Coord( k , 2 ) - 2 : Coord( k , 2 ) - 1);
        
        U( Coord( k , 1 ) , Coord( k , 2 ) ) = median( [ TopRow , BottomRow , LeftValue ] );
        
    elseif Coord( k , 1 ) == 1 && Coord( k , 2 ) == 1
        BottomRow = U( Coord( k , 1 ) + 1 , Coord( k , 2 ) : Coord( k , 2 ) + 1 );
        BottomBottomRow = U( Coord( k , 1 ) + 2 , Coord( k , 2 ) );
        RightValue = U( Coord( k , 1 ) , Coord( k , 2 ) + 1 : Coord( k , 2 ) + 2 );
        
        U( Coord( k , 1 ) , Coord( k , 2 ) ) = median( [ BottomRow , BottomBottomRow , RightValue ] );
        
    elseif Coord( k , 1 ) == 1 && Coord( k , 2 ) == SU(2)
        BottomRow = U( Coord( k , 1 ) + 1 , Coord( k , 2 ) - 1 : Coord( k , 2 ) );
        BottomBottomRow = U( Coord( k , 1 ) + 2 , Coord( k , 2 ) );
        LeftValue = U( Coord( k , 1 ) , Coord( k , 2 ) - 2 : Coord( k , 2 ) - 1 );
        
        U( Coord( k , 1 ) , Coord( k , 2 ) ) = median( [ BottomRow , BottomBottomRow , LeftValue ] );
        
    elseif Coord( k , 1 ) == SU(1) && Coord( k , 2 ) == 1
        TopRow = U( Coord( k , 1 ) - 1 , Coord( k , 2 ) : Coord( k , 2 ) + 1 );
        TopTopRow = U( Coord( k , 1 ) - 2 , Coord( k , 2 ) );
        RightValue = U( Coord( k , 1 ) , Coord( k , 2 ) + 1 : Coord( k , 2 ) + 2 );
        
        U( Coord( k , 1 ) , Coord( k , 2 ) ) = median( [ TopRow , TopTopRow , RightValue ] );
        
    elseif Coord( k , 1 ) == SU(1) && Coord( k , 2 ) == SU(2)
        TopRow = U( Coord( k , 1 ) - 1 , Coord( k , 2 ) - 1 : Coord( k , 2 ) );
        TopTopRow = U( Coord( k , 1 ) - 2 , Coord( k , 2 ) );
        LeftValue = U( Coord( k , 1 ) , Coord( k , 2 ) - 2 : Coord( k , 2 ) + 1 );
        
        U( Coord( k , 1 ) , Coord( k , 2 ) ) = median( [ TopRow , TopTopRow , LeftValue ] );
        
    end
        
end



end